Java中获取应用程序的服务器名称 java获取应用路径

您所在的位置:网站首页 vc 获取当前路径 Java中获取应用程序的服务器名称 java获取应用路径

Java中获取应用程序的服务器名称 java获取应用路径

2023-05-31 05:39| 来源: 网络整理| 查看: 265

 

对于Java程序,无论是未打包的还是打包的JAR或WAR文件,有时候都需要获取它运行所在目录信息,如何做到这一点呢? 在Java处理的文件系统中,目录的表示方式有两种: (1)绝对目录,它以"/"为起始字符,代表从根目录下开始寻找给出的目录,如/c:/java (2)相对路径,它以不带“/”的目录名表示,表示以当前Java程序正在运行的目录作为起始目录来寻找给出的目录。如 java/classes。在相对路径中,有一些特定的字符,可以代表特的的目录,比如,“.”代表当前目录,“..”代表当前目录的上一级目录。在网上 很多给出的例子中,就是利用"."作为目录名,构造File对象的实例,然后通过File对象的方法来获取当前程序运行的目录。 这种方法虽然简单,但有时不能正确的得出当前程序的运行目录。原因在于,运行Java程序不一定要进入到该程序的类文件或JAR文件所在的目录,只要在运 行时指定了正确的类路径信息,就可以在任何目录中运行Java程序,此时利用这种方法只能得到发出运行命令时所在的目录信息。      从上面的分析可以看出,对于很多Java程序,尤其是WEB程序,利用当前路径的“.”表示法,都不能满足要求。那么怎样才能正确的得到运行目录信息呢?      在Web程序中,利用Servlet API可以获得一些路径信息,比如HttpServletRequest接口中定义的getRealPath方法,但类似这些方法都依赖于Servlet环境,不便于程序的单元测试。     本文提供了一种只使用Java标准API的路径探测方法,就是利用ClassLoader抽象类。 利用java.lang.Class的getClassLoader方法,可以获得给定类的ClassLoader实例,它的getResource方法 可以获得当前类装载器中的资源的位置,我们可以利用类文件的名称作为要查找的资源,经过处理后就可获得当前Java程序的运行位置信息,其伪代码如下:     获得Class参数的所在的类名     取得该类所在的包名     将包名转换为路径     利用getResource得到当前的类文件所在URL 利用URL解析出当前Java程序所在的路径    具体代码如下:

Java代码 

1 /**----------------------------------------------------------------------- 2 3 *getAppPath需要一个当前程序使用的Java类的class属性参数,它可以返回打包过的 4 5 6 *Java可执行文件(jar,war)所处的系统目录名或非打包Java程序所处的目录 7 8 *@param cls为Class类型 9 10 *@return 返回值为该类所在的Java程序运行的目录 11 12 -------------------------------------------------------------------------*/ 13 14 public static String getAppPath(Class cls){ 15 16 //检查用户传入的参数是否为空 17 18 if(cls==null) 19 20 throw new java.lang.IllegalArgumentException("参数不能为空!"); 21 22 ClassLoader loader=cls.getClassLoader(); 23 24 //获得类的全名,包括包名 25 26 String clsName=cls.getName()+".class"; 27 28 //获得传入参数所在的包 29 30 Package pack=cls.getPackage(); 31 32 String path=""; 33 34 //如果不是匿名包,将包名转化为路径 35 36 if(pack!=null){ 37 38 String packName=pack.getName(); 39 40 //此处简单判定是否是Java基础类库,防止用户传入JDK内置的类库 41 42 if(packName.startsWith("java.")||packName.startsWith("javax.")) 43 44 throw new java.lang.IllegalArgumentException("不要传送系统类!"); 45 46 //在类的名称中,去掉包名的部分,获得类的文件名 47 48 clsName=clsName.substring(packName.length()+1); 49 50 //判定包名是否是简单包名,如果是,则直接将包名转换为路径, 51 52 if(packName.indexOf(".")-1) realPath=realPath.substring(pos+5); 89 90 //去掉路径信息最后包含类文件信息的部分,得到类所在的路径 91 92 pos=realPath.indexOf(path+clsName); 93 94 realPath=realPath.substring(0,pos-1); 95 96 //如果类文件被打包到JAR等文件中时,去掉对应的JAR等打包文件名 97 98 if(realPath.endsWith("!")) 99 100 realPath=realPath.substring(0,realPath.lastIndexOf("/")); 101 102 /*------------------------------------------------------------ 103 104 ClassLoader的getResource方法使用了utf-8对路径信息进行了编码,当路径 105 106 中存在中文和空格时,他会对这些字符进行转换,这样,得到的往往不是我们想要 107 108 的真实路径,在此,调用了URLDecoder的decode方法进行解码,以便得到原始的 109 110 中文及空格路径 111 112 -------------------------------------------------------------*/ 113 114 try{ 115 116 realPath=java.net.URLDecoder.decode(realPath,"utf-8"); 117 118 }catch(Exception e){throw new RuntimeException(e);} 119 120 return realPath; 121 122 }//getAppPath定义结束 123 124 /----------------------------------------------------------------- 125 126 /**----------------------------------------------------------------------- 127 *getAppPath需要一个当前程序使用的Java类的class属性参数,它可以返回打包过的 128 *Java可执行文件(jar,war)所处的系统目录名或非打包Java程序所处的目录 129 *@param cls为Class类型 130 *@return 返回值为该类所在的Java程序运行的目录 131 -------------------------------------------------------------------------*/ 132 public static String getAppPath(Class cls){ 133 //检查用户传入的参数是否为空 134 if(cls==null) 135 throw new java.lang.IllegalArgumentException("参数不能为空!"); 136 ClassLoader loader=cls.getClassLoader(); 137 //获得类的全名,包括包名 138 String clsName=cls.getName()+".class"; 139 //获得传入参数所在的包 140 Package pack=cls.getPackage(); 141 String path=""; 142 //如果不是匿名包,将包名转化为路径 143 if(pack!=null){ 144 String packName=pack.getName(); 145 //此处简单判定是否是Java基础类库,防止用户传入JDK内置的类库 146 if(packName.startsWith("java.")||packName.startsWith("javax.")) 147 throw new java.lang.IllegalArgumentException("不要传送系统类!"); 148 //在类的名称中,去掉包名的部分,获得类的文件名 149 clsName=clsName.substring(packName.length()+1); 150 //判定包名是否是简单包名,如果是,则直接将包名转换为路径, 151 if(packName.indexOf(".")-1) realPath=realPath.substring(pos+5); 170 //去掉路径信息最后包含类文件信息的部分,得到类所在的路径 171 pos=realPath.indexOf(path+clsName); 172 realPath=realPath.substring(0,pos-1); 173 //如果类文件被打包到JAR等文件中时,去掉对应的JAR等打包文件名 174 if(realPath.endsWith("!")) 175 realPath=realPath.substring(0,realPath.lastIndexOf("/")); 176 /*------------------------------------------------------------ 177 ClassLoader的getResource方法使用了utf-8对路径信息进行了编码,当路径 178 中存在中文和空格时,他会对这些字符进行转换,这样,得到的往往不是我们想要 179 的真实路径,在此,调用了URLDecoder的decode方法进行解码,以便得到原始的 180 中文及空格路径 181 -------------------------------------------------------------*/ 182 try{ 183 realPath=java.net.URLDecoder.decode(realPath,"utf-8"); 184 }catch(Exception e){throw new RuntimeException(e);} 185 return realPath; 186 }//getAppPath定义结束 187 //-----------------------------------------------------------------

 

该方法既可以用于JAR或WAR文件,也可以用于非JAR文件。但要注意以下2点:

不要传递系统的类,作为getAppPath的参数,如java.lang.String.class,当然,也不要传递那些已经位于JDK中的那些类,比如xml相关的一些类等等。要传递应该是程序中主要的运行类,不要传递程序中的支持类库中的类文件,也就是那些第三方的类库中的类文件,否则得到的将是那些类库的位置。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3